package video

import (
	"encoding/json"
	db "tacitus/library/database"
)

// 观看记录，保存到site库中
type Record struct {
	ID        int64 `json:"id" xorm:"pk autoincr"`
	UserID    int64 `json:"user_id"`
	VideoID   int64 `json:"video_id"`
	TaskCode string `json:"task_code"` // 任务编号，用来区分不同的任务，比如老师布置的作业
	StartProgress int `json:"start_progress"`
	EndProgress   int `json:"end_progress"`
	LastProgress int `json:"last_progress"` // 上次上传时所在的进度
	WatchDuration int `json:"watch_duration"` // 观看时长，包含重复观看的部分
	UpdateTime int64 `json:"update_time"`
}

func (Record) TableName() string {
	return db.TablePrefix + "video_record"
}

func (d Record) MarshalBinary() (data []byte, err error) {
	return json.Marshal(d)
}

func (d *Record) UnmarshalBinary(data []byte) error {
	return json.Unmarshal(data, d)
}

// 进度统计
// user_id-video_id-task_code是一组唯一索引，不能被xorm支持，所以不要同步这个表的结构
// ALTER TABLE `t_video_stat` ADD UNIQUE INDEX `key` (`user_id`, `video_id`, `task_code`) USING BTREE ;
// task_code为空表示统计时不区分task_code，所有该用户看该视频的记录都会被统计进去
type Stat struct {
	ID        int64 `json:"id" xorm:"pk autoincr"`
	UserID    int64 `json:"user_id"`
	VideoID   int64 `json:"video_id"`
	TaskCode string `json:"task_code"` // 任务编号，用来区分不同的任务，比如老师布置的作业
	LastProgress int `json:"last_progress"` // 上次上传时所在的进度
	ValidDuration int `json:"valid_duration"` // 有效观看时长
	TotalDuration int `json:"total_duration"` // 总观看时长
	VideoDuration int `json:"video_duration"` // 视频时长
	UpdateTime int64 `json:"update_time"`
}

func (Stat) TableName() string {
	return db.TablePrefix + "video_stat"
}

func MatchValidDuration(uid int64, vis []int64) (res map[int64]int, err error) {
	data := make([]Stat, 0)
	if err = sx.Where("user_id = ?", uid).In("video_id", vis).Cols("video_id", "valid_duration").Find(&data); err != nil {
		return
	}
	res = make(map[int64]int)
	for _, item := range data {
		res[item.VideoID] = item.ValidDuration
	}
	return
}